<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function doSomething(){}
        console.log('doSomething-prototype',doSomething.prototype)
        console.log('doSomething-constructor',doSomething.constructor)
        console.log('doSomething-__proto__',doSomething.__proto__)

        const arr = new Array(1,2,3)
        arr.reverse()
        arr.sort()
        console.log(Array.prototype) // 数组方法都在这个里面
        console.log('constructor',Array.prototype.constructor) // 数组方法都在这个里面
        // arr 是构造函数Array的实例，就可以使用这些方法

        // 原型: 每个函数都有prototype属性，称之为原型
        // 因为prototype属性的值是个对象，因此也称之为原型对象
        // 但是每个对象都有__proto__属性，它的作用是指向原型对象，正是__proro__的存在，才可以使用原型对象的这些方法
        

        // 原型/原型对象作用:1、存放一些属性和方法   2、在js中实现继承

        // 原型链: 对象都有__proto__属性，这个属性指向他的原型对象，原型对象也是对象，也有__proto__属性，指向原型对象的原型对象，
        // 这样一层一层形成的链式结构称为原型链,最顶层找不到就返回null

        // 1、构造函数Person,它的实例person ---> person的__proto__(也叫隐式原型)就是Person.prototype(也叫显式原型),
        console.log('相等吗',arr.__proto__ === Array.prototype); // true

        // 2、Person.prototype的__proto__就是Object.prototype,
        console.log('Array.prototype.__proto__',Array.prototype.__proto__);
        console.log(Object.prototype === Array.prototype.__proto__) // true

        // 3、Object.prototype的__proto__ 就是null
        console.log('Array.prototype.__proto__2',Array.prototype.__proto__.__proto__);
        console.log(Array.prototype.__proto__.__proto__ === null)    // true    

        class Person{
            constructor(name){
                this.name = name
            }
            drink(){
                console.log('喝水');
            }
        }

        class Teacher extends Person {
            constructor(name,subject){
                super(name)  // 调用父类的构造函数，调用父类的方法
                this.subject = subject
            }
            teach(){
                console.log(`我是${this.name},教${this.subject}`)
            }
        }

        const teacher = new Teacher('哈默','前端开发')
        console.log('teacher',teacher);
        teacher.hasOwnProperty('name')
        teacher.hasOwnProperty('teach')
        teacher.teach()
        teacher.drink()
    </script>   
</body>
</html>